/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package raccoon.suvisa.logica.servicios.manejador.entidades.fi.beans;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.logging.Logger;
import javax.ejb.EJB;
import raccoon.suvisa.logica.servicios.manejador.entidades.fi.*;
import javax.ejb.Stateless;
import raccoon.suvisa.datos.entities.Cuenta;
import raccoon.suvisa.datos.entities.Entidad;
import raccoon.suvisa.datos.entities.Tarjeta;
import raccoon.suvisa.datos.entities.Thabiente;
import raccoon.suvisa.datos.entities.TipoTarjeta;
import raccoon.suvisa.datos.entities.Transaccion;
import raccoon.suvisa.datos.entities.Usuario;
import raccoon.suvisa.datos.entities.Usuarioxcuenta;
import raccoon.suvisa.datos.fachadas.TarjetaRemote;
import raccoon.suvisa.datos.fachadas.TransaccionRemote;
import raccoon.suvisa.logica.servicios.localizadorServicios.LocalizadorDatosLocal;
import raccoon.suvisa.logica.serviciosweb.consumidos.WSgenericoRemote;

/**
 *
 * @author Gabriel
 */
@Stateless
public class BancoBean implements BancoRemote {

    @EJB
    private LocalizadorDatosLocal data;
    @EJB
    private TransaccionRemote tremote;
    @EJB
    private WSgenericoRemote ws;

    @Override
    public boolean logearse(String usuario, String password) {
        boolean existeBanco = false;
        //Consulta si existe usuario con su password

        if (existeBanco) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public boolean salirdelSistema() {
        return true;
    }

    @Override
    public BigDecimal registrarUsuario(
            String nombre,
            String apellido,
            String email,
            String username,
            String password,
            String tipo_identificacion,
            BigInteger numero_identificacion,
            String direccion,
            String telefono,
            BigInteger id_entidad,
            String rol,
            char activo) {
        Usuario usuarioNuevo = new Usuario();
        try {
            usuarioNuevo.setNombre(nombre);
            usuarioNuevo.setUsername(username);
            usuarioNuevo.setApellido(apellido);
            usuarioNuevo.setEmail(email);
            usuarioNuevo.setPassword(password);
            usuarioNuevo.setTipoIdentificacion(tipo_identificacion);
            usuarioNuevo.setNumeroIdentificacion(numero_identificacion); //Pilos, hay que ver cual es el dato final de eso
            usuarioNuevo.setDireccion(direccion);
            usuarioNuevo.setTelefono(telefono);
            usuarioNuevo.setIdEntidad(id_entidad);
            usuarioNuevo.setRol(rol);
            usuarioNuevo.setActivo(activo);
            BigDecimal idUsuario = data.getFachadaDatos().getMetodosUsuario().guardarNuevoUsuario(usuarioNuevo);
            System.out.println("idusuario " + idUsuario);
            if (idUsuario == BigDecimal.ZERO) {
                return new BigDecimal("0");
            } else {
                BigDecimal idCuenta = this.crearCuenta(idUsuario, 'T');
                System.out.println("idCuenta " + idCuenta);
                if (idCuenta == BigDecimal.ZERO) {
                    return new BigDecimal("0");
                } else {
                    Usuarioxcuenta idUsuarioXcuenta = new Usuarioxcuenta();
                    idUsuarioXcuenta.setIdCuenta(idCuenta);
                    idUsuarioXcuenta.setIdUsuario(idUsuario.toBigInteger());
                    boolean bandera = false;
                    bandera = data.getFachadaDatos().getMetodosUsuarioXcuenta().guardarNuevoUsuarioxcuenta(idUsuarioXcuenta);
                    if (bandera) {
                        // Si bandera es verdadera entonces devuelva el id del usuario creado
                        return idUsuario;
                    } else {

                        // Devuelva "0" si no se registro en la tabla "Usuario X Cuenta"
                        return new BigDecimal("0");
                    }
                }
            }

        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR al crear el Usuario");
            return new BigDecimal("0");
        }

    }

    @Override
    public boolean modificarUsuario(BigDecimal id_usuario,
            String nombre,
            String apellido,
            String email,
            String username,
            String password,
            String tipo_identificacion,
            BigInteger numero_identificacion,
            String direccion,
            String telefono,
            BigInteger id_entidad,
            String rol,
            char activo) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Usuario usuario = new Usuario();
            usuario = data.getFachadaDatos().getMetodosUsuario().getUsuario(id_usuario);
            if (!nombre.equals(usuario.getNombre())) {
                usuario.setUsername(nombre);
            }
            if (!apellido.equals(usuario.getApellido())) {
                usuario.setApellido(apellido);
            }
            if (!email.equals(usuario.getEmail())) {
                usuario.setEmail(email);
            }
            if (!username.equals(username)) {
                System.out.println("No es posible cambiar el usuario");
            }
            if (!password.equals(usuario.getPassword())) {
                usuario.setPassword(password);
            }
            if (!tipo_identificacion.equals(usuario.getTipoIdentificacion())) {
                usuario.setTipoIdentificacion(tipo_identificacion);
            }
            if (!numero_identificacion.toString().equals(usuario.getNumeroIdentificacion().toString())) {
                usuario.setNumeroIdentificacion(numero_identificacion);
            }
            if (!direccion.equals(usuario.getDireccion())) {
                usuario.setDireccion(direccion);
            }
            if (!telefono.equals(usuario.getTelefono())) {// Conversión telefono a String para comparación
                usuario.setTelefono(telefono);
            }
            if (!id_entidad.equals(usuario.getIdEntidad())) {
                usuario.setIdEntidad(id_entidad);
            }
            if (!rol.equals(usuario.getRol())) {
                usuario.setRol(rol);
            }
            if (activo != usuario.getActivo()) {
                usuario.setActivo(activo);
            }
            return data.getFachadaDatos().getMetodosUsuario().actulizarUsuario(usuario);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A actualizarUsuario");
            return false;
        }
    }

    @Override
    public boolean eliminarUsuario(BigDecimal id_usuario) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Usuario usuario = new Usuario();
            usuario = data.getFachadaDatos().getMetodosUsuario().getUsuario(id_usuario);
            usuario.setPassword("/./");
            usuario.setUsername("/./");
            return data.getFachadaDatos().getMetodosUsuario().actulizarUsuario(usuario);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A eliminarUsuario");
            return false;
        }

    }

    @Override
    public boolean registrarTarjetahabiente(
            String numeroidentificacion,
            String nombre,
            String apellido,
            String telefono,
            String direccion,
            Double cupoaprobado,
            Double ingresosmensuales,
            char aprobado,
            char activo,
            BigInteger id_entidad,
            String email) {
        try {
            Thabiente tarjetaHabiente = new Thabiente();
            tarjetaHabiente.setNid(numeroidentificacion);
            tarjetaHabiente.setNombre(nombre);
            tarjetaHabiente.setApellido(apellido);
            tarjetaHabiente.setTel(telefono);
            tarjetaHabiente.setDir(direccion);
            tarjetaHabiente.setCupoa(cupoaprobado);
            tarjetaHabiente.setIngresomes(ingresosmensuales);
            tarjetaHabiente.setAprovado('F');   //Por Defecto
            tarjetaHabiente.setActivo('F');     //Por Defecto
            tarjetaHabiente.setEmail(email);
            return data.getFachadaDatos().getMetodosTarjetaHabiente().guardarNuevoTarjetaHabiente(tarjetaHabiente, new BigDecimal(id_entidad));

        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A solicitar Tarjeta de Cédito");
            return false;
        }

    }

    //Por terminar
    @Override
    public boolean modificarTarjetahabiente(
            String numeroidentificacion,
            String nombre,
            String apellido,
            String telefono,
            String direccion,
            Double cupoaprobado,
            Double ingresosmensuales,
            char aprobado,
            char activo,
            String email) {

        try {
            //BigDecimal numeroidentificacion, String nombre, String apellido, String telefono, String direccion, BigInteger cupoaprobado, BigInteger ingresosmensuales, char aprobado, char activo
            Thabiente tarjetaHabiente = new Thabiente();

            tarjetaHabiente.setNid(numeroidentificacion);
            tarjetaHabiente.setNombre(nombre);
            tarjetaHabiente.setApellido(apellido);
            tarjetaHabiente.setTel(telefono);
            tarjetaHabiente.setDir(direccion);
            tarjetaHabiente.setCupoa(cupoaprobado);
            tarjetaHabiente.setIngresomes(ingresosmensuales);
            tarjetaHabiente.setAprovado(aprobado);
            tarjetaHabiente.setActivo(activo);
            return data.getFachadaDatos().getMetodosTarjetaHabiente().actualizarTarjetaHabiente(tarjetaHabiente);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR al modificar tarjetahabiente");
            return false;
        }

    }

    @Override
    public boolean eliminarTarjetahabiente(String numeroidentificacion) {
        try {
            //BigDecimal numeroidentificacion, String nombre, String apellido, String telefono, String direccion, BigInteger cupoaprobado, BigInteger ingresosmensuales, char aprobado, char activo
            Thabiente tarjetaHabiente = new Thabiente();
            tarjetaHabiente = data.getFachadaDatos().getMetodosTarjetaHabiente().getTarjetahabiente(numeroidentificacion);
            tarjetaHabiente.setActivo('F'); //Debería ser si esta eliminado o no
            return data.getFachadaDatos().getMetodosTarjetaHabiente().actualizarTarjetaHabiente(tarjetaHabiente);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR al eliminarTarjetahabiente");
            return false;
        }
    }

    @Override
    public boolean bloquearTarjetahabiente(String numeroidentificacion) {

        try {
            //BigDecimal numeroidentificacion, String nombre, String apellido, String telefono, String direccion, BigInteger cupoaprobado, BigInteger ingresosmensuales, char aprobado, char activo
            Thabiente tarjetaHabiente = new Thabiente();
            tarjetaHabiente = data.getFachadaDatos().getMetodosTarjetaHabiente().getTarjetahabiente(numeroidentificacion);
            tarjetaHabiente.setActivo('F'); //Debería ser si esta eliminado o no
            return data.getFachadaDatos().getMetodosTarjetaHabiente().actualizarTarjetaHabiente(tarjetaHabiente);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR al bloquearTarjetahabiente");
            return false;
        }
    }

    @Override
    public BigDecimal solicitarTarjetaCredito(BigDecimal numeroTarjeta,
            String idTipoTarjeta,
            BigDecimal idCuenta,
            char activa,
            Double saldo,
            String paisexpedicion,
            Date fechaVencimiento,
            BigDecimal idEntidad) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Tarjeta t = new Tarjeta();
            t.setActiva(activa);
            t.setIdCuenta(idCuenta.toBigInteger());
            log.info("Inserto idCuenta:");
            t.setIdTipoTarjeta(idTipoTarjeta);
            log.info("Tipo tarjeta:" + t.getIdTipoTarjeta());
            t.setNumeroTarjeta(numeroTarjeta.toBigInteger());
            log.info("iInserto numeroTarjeta:");
            t.setPaisexpedicion(paisexpedicion);
            t.setSaldo(saldo);
            t.setFechaVencimiento(fechaVencimiento);
            log.info("Inserto fecha vencimiento");
            t.setIdEntidad(idEntidad.toBigInteger());
            BigDecimal idTarjeta = data.getFachadaDatos().getMetodosTarjeta().guardarNuevaTarjeta(t);
            return idTarjeta;
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("registrarNuevaTarjeta");
        }
        return new BigDecimal(0);

    }

    @Override
    public BigDecimal crearCuenta(BigDecimal idUsuario, char tipocuenta) {

        Logger log = Logger.getLogger(BancoBean.class.getName());
        Usuario usuario = new Usuario();
        Cuenta cuenta = new Cuenta();
        usuario = data.getFachadaDatos().getMetodosUsuario().getUsuario(idUsuario);
        if (usuario == null) {
            return new BigDecimal("0");
        } else {
            cuenta.setActiva('F');
            cuenta.setFechaApertura(new Date());
            cuenta.setTipocuenta(tipocuenta);
            return data.getFachadaDatos().getMetodosCuenta().guardarNuevaCuenta(cuenta);
        }
    }

    @Override
    public BigDecimal crearCuentaTH(String numerodeIdentifiacion, char tipocuenta) {

        Logger log = Logger.getLogger(BancoBean.class.getName());
        Thabiente TH = new Thabiente();
        Cuenta cuenta = new Cuenta();
        TH = data.getFachadaDatos().getMetodosTarjetaHabiente().getTarjetahabiente(numerodeIdentifiacion);
        if (numerodeIdentifiacion == null) {
            return new BigDecimal("0");
        } else {
            cuenta.setActiva('F');
            cuenta.setFechaApertura(new Date());
            cuenta.setTipocuenta(tipocuenta);
            return data.getFachadaDatos().getMetodosCuenta().guardarNuevaCuenta(cuenta);
        }
    }

    @Override
    public boolean bloquearTarjeta(BigDecimal id_tarjeta) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Tarjeta tarjeta = new Tarjeta();
            tarjeta = data.getFachadaDatos().getMetodosTarjeta().getTarjeta(id_tarjeta);
            tarjeta.setActiva('F');
            return data.getFachadaDatos().getMetodosTarjeta().actualizarTarjeta(tarjeta);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A bloquearTarjeta");
            return false;
        }
    }

    public boolean desbloquearTarjeta(BigDecimal id_tarjeta) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Tarjeta tarjeta = new Tarjeta();
            tarjeta = data.getFachadaDatos().getMetodosTarjeta().getTarjeta(id_tarjeta);
            tarjeta.setActiva('V');
            return data.getFachadaDatos().getMetodosTarjeta().actualizarTarjeta(tarjeta);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A desbloquearTarjeta");
            return false;
        }
    }

    @Override
    public Double consultarSaldo(BigDecimal id_tarjeta) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Tarjeta tarjeta = new Tarjeta();
            tarjeta = data.getFachadaDatos().getMetodosTarjeta().getTarjeta(id_tarjeta);
            Double saldoActual = tarjeta.getSaldo();
            return saldoActual;
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A consultarSaldo");
            return new Double("0");
        }
    }

    @Override
    public boolean modificarSaldo(BigDecimal id_tarjeta, float valordelmonto) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Tarjeta tarjeta = new Tarjeta();
            tarjeta = data.getFachadaDatos().getMetodosTarjeta().getTarjeta(id_tarjeta);
            Double saldoActual = tarjeta.getSaldo();
            if (saldoActual < valordelmonto) {
                return false;
            } else {
                tarjeta.setSaldo(saldoActual - valordelmonto);
                return data.getFachadaDatos().getMetodosTarjeta().actualizarTarjeta(tarjeta);
            }

        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A modificarSaldo");
            return false;
        }
    }

    @Override
    public void generarReporte() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void hacerBusqueda() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public BigDecimal registrarSucursal(BigInteger nit, String nombre_entidad, char sucursal, char cajero) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            log.info("ENTRE A registrarSucursal");
            Entidad entidad = new Entidad();
            entidad.setActivo('F');
            entidad.setCajero('V');
            entidad.setIdEntidad(new BigDecimal("1010"));
            entidad.setNit(new BigInteger("1011"));
            entidad.setNombreEntidad("NuevaEntidad");
            entidad.setSucursal("V");
            return data.getFachadaDatos().getMetodosEntidad().guardarNuevaEntidad(entidad);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A registrarSucursal");
            return new BigDecimal("0");
        }

    }

    @Override
    public boolean eliminarSucursal(BigDecimal id_entidad) {

        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Entidad entidad = new Entidad();
            entidad = data.getFachadaDatos().getMetodosEntidad().getentidad(id_entidad);
            entidad.setActivo('F');
            return data.getFachadaDatos().getMetodosEntidad().actualizarEntidad(entidad);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A eliminarSucursal");
            return false;
        }
    }

    @Override
    public BigDecimal registrarCajero(BigInteger nit,
            String nombreEntidad,
            char activo,
            char cajero,
            char sucursal,
            char entidadcomercial,
            char entidadservpublicos,
            char banco,
            char cajacompensasion,
            char financiamientocomercial) {
        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Entidad entidad = new Entidad();
            entidad.setNit(nit);
            entidad.setNombreEntidad(nombreEntidad);
            entidad.setActivo('F');
            entidad.setCajero('V');
            entidad.setSucursal("F");
            entidad.setEntidadcomercial('F');
            entidad.setEntidadservpublicos('F');
            entidad.setBanco('F');
            entidad.setCajacompensasion('F');
            entidad.setFinanciamientocomercial('F');
            return data.getFachadaDatos().getMetodosEntidad().guardarNuevaEntidad(entidad);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A registrarCajero");
            return new BigDecimal("0");
        }
    }

    @Override
    public boolean eliminarCajero(BigDecimal id_entidad) {
        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            Entidad entidad = new Entidad();
            entidad = data.getFachadaDatos().getMetodosEntidad().getentidad(id_entidad);
            entidad.setActivo('F');
            return data.getFachadaDatos().getMetodosEntidad().actualizarEntidad(entidad);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("ERROR A eliminarCajero");
            return false;
        }
    }

    @Override
    public boolean deshacerTransaccion(BigDecimal id_transaccion) {
        try {
            Logger log = Logger.getLogger(BancoBean.class.getName());
            log.info("Entre a deshacer Transaccion");
            return data.getFachadaDatos().getMetodosTransaccion().deshacerTransaccion(id_transaccion);
        } catch (Exception e) {
            Logger.getLogger(BancoBean.class.getName()).info("Error al deshacer Transaccion");
            return false;
        }
    }

    @Override
    public BigDecimal registrarPago(BigDecimal idTarjeta, Double monto, BigInteger cuotas, BigInteger cuentaDe) {
        try {
            TarjetaRemote tr = data.getFachadaDatos().getMetodosTarjeta();
            Transaccion tccion = new Transaccion();
            if (tr != null) {
                Tarjeta t = tr.getTarjeta(idTarjeta);
                if (t.getActiva() == 'V') {
                    TipoTarjeta tt = data.getFachadaDatos().getMetodosTipoTarjeta().getTipoTarjeta(new BigDecimal(t.getIdTipoTarjeta()));
                    Double cupoMax = tt.getCupomax();
                    if (t.getSaldo() < cupoMax + monto) {
                        t.setSaldo(t.getSaldo() + monto + ((monto * 0.02) * new Double(cuotas.toString())));
                        tccion.setCancelada('F');
                        tccion.setCuotas(cuotas);
                        Date d = new Date();
                        String fecha;
                        fecha = d.getDay() + "/" + d.getMonth() + "/" + d.getYear();
                        tccion.setFecha(new Date(fecha));
                        tccion.setFechacancelada(new Date());
                        String cuenta = data.getFachadaDatos().getMetodosCuenta().getCuenta(new BigDecimal(t.getIdCuenta().toString())).getNumeroCuenta().toString();
                        tccion.setIdCuentao(new BigInteger(cuenta));
                        tccion.setIdCuentad(cuentaDe);
                        tccion.setIdTransaccion(BigDecimal.ZERO);
                        tccion.setMonto(monto);
                        BigDecimal ret = tremote.guardarNuevaTransaccion(tccion);
                        if (ret != BigDecimal.ZERO) {
                            String idCliente = data.getFachadaDatos().getMetodostarjetaHabientexTarjetaRemote().gettarjetaHabientexTarjeta(idTarjeta).getNumeroidentificacionth().toString();
                            String idTransaccion = ret.toString();
                            int tipo = 1;
                            if (ws.serviciosPublicos(cuenta, fecha, idCliente, idTarjeta.toString(), idTransaccion, monto.toString())) {
                                return ret;
                            } else {
                                tremote.deshacerTransaccion(tccion.getIdTransaccion());
                            }
                        }
                    }
                }
            }
            return BigDecimal.ZERO;
        } catch (Exception e) {
            return BigDecimal.ZERO;
        }
    }
}
